import { defineStore } from 'pinia'
import { frontLogin, frontLogout, getFrontUserInfo } from '@/api/frontAuth'
import { ElMessage } from 'element-plus'

export const useFrontUserStore = defineStore('frontUser', {
  state: () => ({
    token: localStorage.getItem('frontToken') || '',
    userInfo: JSON.parse(localStorage.getItem('frontUserInfo') || '{}')
  }),
  
  getters: {
    isFrontLoggedIn: (state) => !!state.token,
    username: (state) => state.userInfo.username || '',
    userId: (state) => state.userInfo.id || null,
    avatarUrl: (state) => state.userInfo.avatar || ''
  },
  
  actions: {
    // 前台用户登录
    async frontLoginAction(userInfo) {
      try {
        const { username, password } = userInfo
        console.log('开始前台登录请求:', { username })
        
        const response = await frontLogin({ username, password })
        
        console.log('前台登录响应完整数据:', JSON.stringify(response))
        
        // 后端返回格式：{ code: 200, msg: "操作成功", data: { token: "xxx", userInfo: {...} } }
        if (response.code !== 200) {
          return Promise.reject(new Error(response.msg || '登录失败'))
        }
        
        // 从响应的data字段中提取数据
        const loginResponse = response.data
        if (!loginResponse) {
          return Promise.reject(new Error('登录失败：响应数据为空'))
        }
        
        console.log('前台登录数据:', JSON.stringify(loginResponse))
        
        // 提取token和userInfo
        const token = loginResponse.token
        const userData = loginResponse.userInfo
        
        if (!token) {
          console.error('无法从响应中提取token:', loginResponse)
          return Promise.reject(new Error('登录失败：无法获取token'))
        }
        
        if (!userData) {
          console.warn('无法从响应中提取用户信息，使用空对象代替')
        }
        
        // 存储token和用户信息到前台专用的localStorage键
        this.token = token
        this.userInfo = userData || {}
        
        // 保存到本地存储（使用不同的key区分前后台）
        localStorage.setItem('frontToken', token)
        localStorage.setItem('frontUserInfo', JSON.stringify(userData || {}))
        
        console.log('前台登录成功，已保存token:', this.token)
        
        return Promise.resolve({ token, userInfo: userData })
      } catch (error) {
        console.error('前台登录请求失败:', error)
        return Promise.reject(error)
      }
    },
    
    // 获取前台用户信息
    async getFrontUserInfoAction() {
      try {
        const response = await getFrontUserInfo()
        console.log('获取前台用户信息响应:', JSON.stringify(response))
        
        // 处理后端返回的标准格式
        if (response.code !== 200) {
          return Promise.reject(new Error(response.msg || '获取用户信息失败'))
        }
        
        // 从响应的data字段提取用户数据
        const userData = response.data
        if (!userData) {
          return Promise.reject(new Error('获取用户信息失败：响应数据为空'))
        }
        
        this.userInfo = userData
        localStorage.setItem('frontUserInfo', JSON.stringify(userData))
        
        return Promise.resolve(userData)
      } catch (error) {
        console.error('获取前台用户信息失败:', error)
        return Promise.reject(error)
      }
    },
    
    // 前台用户登出
    async frontLogoutAction() {
      // 在API调用之前已经清除了本地状态，所以这里不再需要在finally中清除
      // 这样可以避免多次触发状态清除而导致的UI刷新问题
      try {
        const token = localStorage.getItem('frontToken')
        // 只有存在token时才调用登出API
        if (token) {
          await frontLogout()
          console.log('前台登出请求成功')
        } else {
          console.log('无token，跳过前台登出请求')
        }
        return Promise.resolve()
      } catch (error) {
        console.error('前台登出请求失败:', error)
        return Promise.reject(error)
      }
    },
    
    // 重置状态
    resetState() {
      this.token = ''
      this.userInfo = {}
      localStorage.removeItem('frontToken')
      localStorage.removeItem('frontUserInfo')
      console.log('前台用户状态已重置')
    }
  }
}) 